home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / apl / apltex_.com / APL2C_C.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-28  |  2.0 KB  |  83 lines

  1. /*
  2.      APL2C_C.C - APL to C  functions
  3.      Support for APL2PC to C interface
  4.  
  5. */
  6.  
  7. #include "apl2c_h.h"
  8.  
  9. /*
  10.      APL_VHDR - load in APL Variable Header info  to C struct
  11. */
  12. void apl_vhdr(struct aplvhdr * aplvar)
  13. {
  14.      int ptr;
  15.  
  16.      ptr = aplvar->ptr;      /* move bytes 2 thru 8 */
  17.      mov_mem( (char far *) &aplvar->nb,MK_FP(ptr,2),6);
  18.  
  19.      if(aplvar->rank)        /* if non zero rank, move dimensions */
  20.           mov_mem( (char far *)aplvar->dimens,MK_FP(ptr,8),aplvar->rank * 2);
  21. }
  22.  
  23. /*
  24.      VHDR_APL - load (C struct) Variable Header to APL
  25. */
  26. void vhdr_apl(struct aplvhdr * aplvar)
  27. {
  28.      int ptr;
  29.  
  30.      ptr = aplvar->ptr;    /* move bytes 2 thru 8 */
  31.      mov_mem(MK_FP(ptr,2),(char far *) &aplvar->nb,6);
  32.  
  33.      if(aplvar->rank)      /* if non zero rank, move dimensions */
  34.           mov_mem(MK_FP(ptr,8),(char far *)aplvar->dimens,aplvar->rank * 2);
  35. }
  36.  
  37.  
  38. /*
  39.      APL_VFDATA - load in APL Variable DATA
  40.                   NOTE !! - bufr MUST be large enough
  41.                            to hold data ...
  42. */
  43. void apl_vfdata(struct aplvhdr * aplvar,char far * bufr)
  44. {
  45.      int offset,count,bpe;
  46.  
  47.      if(aplvar->type == 3)            /* char = 1 */
  48.           bpe = 1;
  49.      else if(aplvar->type == 2)       /* real = 8 */
  50.           bpe = 8;
  51.      else                             /* ints,2byte char, etc */
  52.           bpe = 2;
  53.  
  54.      offset = 8 + aplvar->rank * 2;   /* where data starts */
  55.      count = aplvar->nelm * bpe;
  56.      mov_mem( (char far *)bufr,MK_FP(aplvar->ptr,offset),count);
  57. }
  58.  
  59. /*
  60.      PEEK - fetch a WORD from memory from SEG:OFF
  61. */
  62. int peek(int seg,int off)
  63. {
  64.      return *(int far *) MK_FP(seg,off);
  65. }
  66.  
  67. /*
  68.     POKE - put a WORD into memory at SEG:OFF
  69. */
  70. void poke(int seg,int off,int word)
  71. {
  72.      *( (int far *)MK_FP(seg,off) ) = word;
  73. }
  74.  
  75. /*
  76.      NOV_MEM - move block of data from one mem location to another
  77. */
  78. void mov_mem(char far * dest,char far * srce,int count)
  79. {
  80.      while(count --)
  81.         *dest++ = *srce++;
  82. }
  83.